<?php
/**
 *
 * 코어 컨트롤러 클래스
 * MVC pattern 의 controller 의 최상위 객체
 */

abstract class coreController
{
    public $params = array();
    public $oExtendAction;

    function __construct($params = array())
    {
        $this->params = $params;
        $this->action = $this->getFindAction();
        $GLOBALS['CONTROLLER_INFO'] = get_class($this).'->'.$this->action;

        $this->doAction();
    }

    final private function getFindAction()
    {
        return (empty($this->params[SC_VARIABLE_METHOD]) === false) ? $this->params[SC_VARIABLE_METHOD] : $this->action;
    }

    final private function doAction()
    {
        /*
        if ($this->isAction()) {
            throw new ExceptionController('해당 Action 에 대한 class 나 method 를 찾지 못했습니다.!!');
        }
        */

        commSession::session_start($this->isCorporation());
        
        // 쿠키, 세션을 저장
        commSession::register();

        // 권한 설정
        $this->auth();
        // 파리미터 필터링
        $this->filter();
        // 페이지 버퍼링
        $this->bufferPage();
    }

    /**
    *
    * corporation 인지 확인
    */
    protected function isCorporation()
    {
        if (strstr(get_class($this), SC_SERVICE_NAME)) {
            return true;
        }

        /*
        if (substr(get_class($this), 0, 5) == 'admin') {
            return true;
        }
        */

        return false;
    }

    /**
     *
     * 개발자 정의형 액션
     */
    final protected function isAction()
    {
        //return (in_array($this->action, get_class_methods($this))) ? true : false;
    }

    protected function auth()
    {

    }

    /**
     *
     * GET, POST 에 대한 문자열 필터링
     */
    protected function filter()
    {
        $this->params = utilFilterSecure::filterSecure(get_class($this), $this->action, $this->params);
        $this->params = utilFilterXss::getValidParams($this->params);
    }

    final private function bufferPage()
    {
        // 버퍼링 구동
        ob_start();
        
        // 쿠키, 세션을 저장
        //commSession::register();
        
        // 확장 액션 class 구분
        $extendClassName = $this->getExtendActionClass();
        if (class_exists($extendClassName)) {
            $this->oExtendAction = new $extendClassName($this);
            $this->oExtendAction->exec();

        } else {
            $this->{$this->action}();
        }

        // 해당 액션에서 정의 된 버퍼를 컨테츠 변수로 할당
        //$contents = ob_get_contents();

        // 쿠키, 세션을 저장
        //commSession::register();

        // 액션에서 정의 된 컨텐츠 버퍼를 삭제
        //ob_end_clean();

        //echo $contents;
    }

    private function getExtendActionClass()
    {
        return substr(get_class($this), 0, -10).'Do'.ucfirst(strtolower($this->action));
    }
}